/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import controller.Conexao;
import controller.Produto;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Alcivando
 */
public class ProdutoDAO {

    Produto produto = new Produto();
    private Connection connection;
    private Conexao conexao;

    public ProdutoDAO() throws SQLException {
        this.connection = Conexao.getConnection();

    }

    public void adiciona(Produto produto) throws SQLException {

        // cria uma lista onde será armazenado o próximo codigo
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codProduto\") from produto;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        //adiciona o codigo ao proximo Produto a ser inserido
        produto.setCodProduto(codigo.get(0));

        // insere os dados do produto com a conexao para o banco de dados.
        String sql = "insert into produto values (?,?,?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, produto.getCodProduto());
        stmt.setString(2, produto.getNome());
        stmt.setDouble(3, produto.getPreco());
        stmt.setString(4, produto.getMarca());
        stmt.setInt(5, produto.getEstoqueMin());
        stmt.setString(6, produto.getTamanho());
        stmt.setInt(7, produto.getCodFornecedor());


        // busca os campos preenchidos na classe de Produto.

        stmt.execute();
        JOptionPane.showMessageDialog(null, "Salvo com sucesso!", "Cadastro Concluído", 1);
        stmt.close();
        // executa e finaliza o processo de adicionar.*/
    }

    public ArrayList<Produto> RetornaTodosProdutos() {
        Statement comando;
        ArrayList<Produto> listaProdutos = new ArrayList<Produto>();

        try {

            String sql = "SELECT * FROM produto";

            comando = connection.createStatement();

            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                produto = new Produto();

                produto.setCodProduto(rs.getInt("codProduto"));
                produto.setNome(rs.getString("nome"));
                produto.setPreco(rs.getDouble("preco"));
                produto.setCodFornecedor(rs.getInt("codFornecedor"));
                produto.setEstoqueMin(rs.getInt("estoqueMin"));
                produto.setMarca(rs.getString("marca"));
                produto.setTamanho(rs.getString("tamanho"));


                listaProdutos.add(produto);

            }
            comando.close();

            return listaProdutos;

        } catch (SQLException ex) {
            return null;
        }
    }

    public void remover(Produto produto) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM produto WHERE \"codProduto\"=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, produto.getCodProduto());
            comando.execute();
            JOptionPane.showMessageDialog(null, "Removido com sucesso!", "Remorcao Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public void atualizar(Produto produto) {
        PreparedStatement comando;
        try {

            String sql = "UPDATE produto SET \"codProduto\" = ?, nome = ?, preco  = ?, \"codFornecedor\" = ?, tamanho = ?, \"estoqueMin\" = ?, marca = ?;";

            comando = connection.prepareStatement(sql);
            comando.setInt(1, produto.getCodProduto());
            comando.setString(2, produto.getNome());
            comando.setDouble(3, produto.getPreco());
            comando.setInt(4, produto.getCodFornecedor());
            comando.setString(5, produto.getTamanho());
            comando.setInt(6, produto.getEstoqueMin());
            comando.setString(7, produto.getMarca());

            comando.executeUpdate();
            JOptionPane.showMessageDialog(null, "Alterado com sucesso!", "Alteracao Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public ArrayList<Produto> retornaProdutoPorNome(String nome) {
        PreparedStatement comando;
        ArrayList<Produto> listaProduto = new ArrayList<Produto>();

        try {
            String sql = "SELECT * FROM produto WHERE nome LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            EstoqueDAO edao = new EstoqueDAO();

            while (rs.next()) {
                Produto p = new Produto();



                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));
                p.setQuantidade(edao.retornaQtdProduto(p));

                listaProduto.add(p);

            }

            comando.close();
            return listaProduto;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Produto> retornaProdutoPorCod(int codigo) {
        PreparedStatement comando;
        ArrayList<Produto> listaProduto = new ArrayList<Produto>();

        try {
            String sql = "SELECT * FROM produto WHERE \"codProduto\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codigo);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Produto p = new Produto();

                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));

                listaProduto.add(p);

            }

            comando.close();
            return listaProduto;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Produto> retornaProdutoPorPreco(Double preco) {
        PreparedStatement comando;
        ArrayList<Produto> listaProduto = new ArrayList<Produto>();

        try {
            String sql = "SELECT * FROM produto WHERE preco LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, preco + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Produto p = new Produto();

                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));

                listaProduto.add(p);

            }

            comando.close();
            return listaProduto;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public Produto retornaProdutoPorCodigo(int codigo) {
        PreparedStatement comando;

        try {
            String sql = "SELECT * FROM produto WHERE \"codProduto\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codigo);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.
            Produto p = new Produto();


            while (rs.next()) {


                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));


            }

            comando.close();
            return p;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codProduto\") from produto;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    public String retornaDescricaoProdutoPorCodigo(int codigo) {
        PreparedStatement comando;

        try {
            String sql = "SELECT * FROM produto WHERE \"codProduto\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, codigo);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {
                Produto p = new Produto();

                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));


            }

            String descricao = produto.getNome() + " - " + produto.getMarca() + " - " + produto.getTamanho();

            comando.close();
            return descricao;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }


     public ArrayList<Produto> retornaProdutoPorMarca(String Marca) {
        PreparedStatement comando;

        try {
            String sql = "SELECT * FROM produto WHERE marca LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, Marca + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.
            
            ArrayList<Produto> listaProduto = new ArrayList<Produto>();
            


            while (rs.next()) {


                Produto p = new Produto();

                p.setEstoqueMin(rs.getInt("estoqueMin"));
                p.setCodProduto(rs.getInt("codProduto"));
                p.setNome(rs.getString("nome"));
                p.setPreco(rs.getDouble("preco"));
                p.setMarca(rs.getString("marca"));
                p.setTamanho(rs.getString("tamanho"));
                p.setCodFornecedor(rs.getInt("codFornecedor"));

                listaProduto.add(p);


            }

            comando.close();
            return listaProduto  ;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
}
